/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package adbus.models;

import adbus.libraries.*;
import java.sql.*;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Kasia
 */
 /**główna klasa Linia*/
public class Linia extends ORM {

     private Przewoznik p;
     private PrzewoznikList carriers = null;
     public Linia() {
         super();
     }
     /**konstruktor klasy Linia z argumentem string*/
    Linia(String string) {
        super();
        nr_lini = string;
    }
        /**metoda pobierająca dostępnych przewoźników*/
         public PrzewoznikList pobierzDostepnychPrzewoznikow() {
        //if(carriers == null || reloadCarrier == true) {
            Przewoznik temp = new Przewoznik();
            LinkedList<Przewoznik> prz = temp.pobierz();
            if(carriers == null) {
                carriers = new PrzewoznikList();
                carriers.setList(prz);
                //list.setList(prz);
                //carriers = list;
            } else {
                carriers.setList(prz);
            }
        //    reloadCarrier = false;
        //}
        return carriers;
    }
    /**metoda pobierająca liste linii*/
    public LinkedList<Linia> pobierz() {
        LinkedList<Linia> linie = new LinkedList<Linia>();
        try {

            ResultSet krs = Database.querySelect(basicQuery() + getWhere(), filtersval);
            while (krs.next()) {
                Linia l = new Linia();
                l.zaladuj(krs);
                linie.add(l);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
        return linie;
    }
    public LinkedList<Pojazd> pobierzPojazdy(String from, String to) {
        LinkedList<Pojazd> pojazdy = new LinkedList<Pojazd>();
        Pojazd tp = new Pojazd();
        tp.setAvailableFilter(from,to);
        tp.setLineFilter(id_linia);
        PojazdList temp = new PojazdList();
        pojazdy = tp.pobierz();
       // temp.setList(pojazdy);
        return pojazdy;
    }
    /**metoda pobierająca liste pojazdów danej lini*/
    public PojazdList pobierzPojazdy() {
        //LinkedList<Pojazd> pojazdy = new LinkedList<Pojazd>();
        Pojazd tp = new Pojazd();
        //tp.setAvailableFilter(from,to);
        tp.setLineFilter(id_linia);
        PojazdList temp = new PojazdList();
        
        temp.setList(tp.pobierz());
        return temp;
    }
    /**metoda pobierająca wszystkie dane o liniach o określonym id*/
    public void pobierzWgId(int id) {
        try {
            zaladuj(Database.querySelect(basicQuery() + " WHERE id_linia = " + id));
        } catch (SQLException ex) {
            Logger.getLogger(Linia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    /**metoda wstawiająca dane z tabeli do odpowiednich zmiennych */
    public void zaladuj(ResultSet set) {
        try {
            if(set.isBeforeFirst()) set.first();
            id_linia = set.getInt("id_linia");
            nr_lini = set.getString("nr_lini");
            nocny = set.getBoolean("nocny");
            dzienny = set.getBoolean("dzienny");
            robocze = set.getBoolean("robocze");
            weekendy = set.getBoolean("weekendy");
            link = set.getString("link");
            trasa = set.getString("trasa");
            id_przewoznik = set.getInt("p.id_przewoźnik");
            carrier_name = set.getString("p.nazwa");
            uwagi = set.getString("uwagi");
//            id_pojazd = set.getInt("id_pojazd");
            //set.getStatement().close();
        } catch (SQLException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
        /**metoda wstawiająca lub aktualizująca dane w tabeli Linie*/
        public void zapisz() {
        String q = null;
        if (id_linia==null){
            q = "INSERT INTO Linie(id_linia,nr_lini,nocny,dzienny,robocze,weekendy,link,id_przewoźnik,uwagi,trasa) " +
                    "VALUES(NULL,?,?,?,?,?,?,?,?,?);";
        } else {
            q = "UPDATE Linie SET nr_lini = ?," +
                    "nocny = ?,dzienny = ?,robocze = ?,weekendy = ?," +
                    "link=?,id_przewoźnik=?,uwagi=?,trasa=? WHERE id_linia = ?";
        }
        LinkedHashMap<String, Object> hm = new LinkedHashMap<String, Object>();
        hm.put("1", nr_lini);
        hm.put("2", nocny?1:0);
        hm.put("3", dzienny?1:0);
        hm.put("4", robocze?1:0);
        hm.put("5", weekendy?1:0);
        hm.put("6", link);
        hm.put("7", id_przewoznik);
        hm.put("8", uwagi);
        hm.put("10", trasa);
        if(id_linia!=null) {
            hm.put("9", id_linia);
        }
        ResultSet res = super.zapisz(q,"id_linia",hm);
        if(id_linia==null) {
            try {
                id_linia = res.getInt(1);
                System.out.println("ID Lini: " + id_linia);
            } catch (SQLException ex) {
                Logger.getLogger(Linia.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    /**metoda przypisująca przewoźnika id_przewoźnika do zmiennej id_przewoźnik w celu przypisania do lini*/
     public void przypiszPrzewoznika(Przewoznik c) {
        p = c;
        id_przewoznik = p.id_przewoźnik;
    }
    /**zmienna przechowująca id lini*/
    public Integer id_linia = null;
    /**zmienna przechowująca numer lini*/
    public String nr_lini;
    /**zmienna przechowująca wartość 1 dla linii nocnej lub 0 jeśli linia nie jest nocna*/
    public boolean nocny;
    /**zmienna przechowująca wartość 1 dla linii dziennej lub 0 jeśli linia nie jest dzienna*/
    public boolean dzienny;
    /**zmienna przechowująca wartość 1 dla linii jeżdżącej w dni robocze lub 0 jeśli linia nie jeździ w robocze*/
    public boolean robocze;
    /**zmienna przechowująca wartość 1 dla linii jeżdżącej w weekend lub 0 jeśli linia nie jeździ w weekendy*/
    public boolean weekendy;
    /**zmienna przechowująca link do strony z informacjami o lini*/
    public String link;
    /**zmienna przechowująca id przewoźnika*/
    public int id_przewoznik;
    /**zmienna przechowująca uwagi dotyczace lini*/
    public String uwagi;
    /**zmienna przechowująca nazwe przewoźnika*/
    public String carrier_name;
    /**zmienna przechowująca dane o trasie lini*/
    public String trasa;

    /**metoda odpowiedzialna za wyszukanie dostępnych lini*/
    void setAvailableFilter(String from, String to) {
        String condition = "id_linia IN ( "
                + "SELECT p.id_linia  "
                + "FROM Pojazdy p  "
                + "JOIN Linie l ON p.id_linia = l.id_linia  "
                + "LEFT JOIN Reklamy r ON p.id_pojazd = r.id_pojazdu  "
                + "LEFT JOIN Kampanie k ON k.id_kampania = r.id_kampania   "
                + "WHERE (NOT( "
                + "(data_rozpoczecia <= ? AND data_zakonczenia > ?) "
                + "OR  (data_rozpoczecia > ? AND data_rozpoczecia <= ?)) "
                + "OR data_rozpoczecia IS NULL) "
                + ")";
        filters.put("available", condition);
        filtersval.put("a1", from);
        filtersval.put("a2", from);
        filtersval.put("a3", from);
        filtersval.put("a4", to);
    }
    /**metoda ustawiająca przewoźnika dla danej lini*/
    void setCarrier(int id_przewoźnik) {
        filters.put("przewoznik", "l.id_przewoźnik = ?");
        filtersval.put("przewoznik", id_przewoźnik);
    }

    /**metoda pobierająca z bazy słowa kluczowe dla lini o podanym id*/
    public String getTags() {
        String tags = new String();
        LinkedHashMap<String,Object> map = new LinkedHashMap();
        map.put("id", id_linia);
        try {
            ResultSet rs = Database.querySelect("SELECT s.słowo as słowo FROM "
                    + "Trasy t "
                    + "JOIN  Słowa_kluczowe s "
                    + "ON s.id_słowo = t.id_słowo "
                    + "WHERE t.id_linia = ?", map);
            while(rs.next()) {
                tags += rs.getString("słowo");
                if(rs.isLast()==false)
                    tags+=", ";
            }
        } catch (SQLException ex) {
            Logger.getLogger(Linia.class.getName()).log(Level.SEVERE, null, ex);
        }

        return tags;
    }

    @Override
    /**metoda pobierająca wszystkie linie z tabeli Linia wraz z danymi o przewoźnikach z tabeli Przewożnicy*/
    public String basicQuery() {
        return "SELECT * FROM Linie l " +
                "JOIN Przewoźnicy p " +
                "ON p.id_przewoźnik = l.id_przewoźnik";
    }
    @Override
    public String toString() {
        return nr_lini;
    }
    /**metoda usuwająca linie o podanym id z tabeli Linie*/
    public void delete() {
        try {
            Database.queryUpdate("DELETE FROM Linie WHERE id_linia = " + id_linia, "id_linia");
        } catch (SQLException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public Przewoznik przewoznik() {
        Przewoznik temp = new Przewoznik();
        temp.pobierzWgId(id_przewoznik);
        return temp;
    }

}
